<?php
ini_set('max_execution_time', 300);
/**
 * @package   auto_occasion
 * @subpackage 
 * @author    CMS
 * @copyright 2011
 * @license    All rights reserved
 */

/*
* inclusion
*/
require_once(LIB_PATH.'jpgraph/jpgraph.php');
require_once(LIB_PATH.'jpgraph/jpgraph_bar.php');

/**
 * Classe permettant de gerer les graph dans les stats
 *
 */
class graphSrv {

    /**
     * Fonction permettant d'avoir le graphique
     * @return
     *
     */
    public function getGraph ($datas = array(), $byDate = false) {

        // récupération des formules par dates
        jClasses::inc('statistique~statSrv');
        $statCurrentMonth['tarif'] = $stat1['tarif'] = $stat2['tarif'] = array();
        if (!$byDate) { 
            $date = statSrv::getThreeLastMonthAndYear();

            // mois courant
            $statCurrentMonth = statSrv::getStats ($date->months[0], $date->year[0]);
//print_r($statCurrentMonth);die();
            // le mois précédent
            $stat1 = statSrv::getStats ($date->months[1], $date->year[1]);

            // le 3è avant dernier mois
            $stat2 = statSrv::getStats ($date->months[2], $date->year[2]);

        }

        $ret = new stdClass();
        $toTake = array();
        if ((sizeof($statCurrentMonth['tarif']) >0 && sizeof($stat1['tarif']) > 0 && sizeof($stat2['tarif']) > 0 && !$byDate) || ($byDate && sizeof($datas))) {
            if (!$byDate) {
                $formule   = self::getFormule($statCurrentMonth);
                $formule1  = self::getFormule($stat1);
                $formule2  = self::getFormule($stat2);
                $max = max(sizeof($formule), sizeof($formule1), sizeof($formule2));

                if ($max == sizeof($formule))  $toTake = $formule;
                if ($max == sizeof($formule1)) $toTake = $formule1;
                if ($max == sizeof($formule2)) $toTake = $formule2;

                $nbFormule = $max;
                for ($k=0; $k<$max; $k++) {
                    ${'data_y' . $k} = array((isset($formule[$k]->nombre)) ? $formule[$k]->nombre : 0, (isset($formule1[$k]->nombre)) ? $formule1[$k]->nombre : 0, (isset($formule2[$k]->nombre)) ? $formule2[$k]->nombre : 0);
                }
            } else {
                $nbFormule = self::getNbMaxFormule($datas);
                $data_y = array();
                for($i=0; $i<$nbFormule; $i++) {
                    for($j=0; $j<$datas['nbDate']; $j++) {
                        $data_y[] = (isset($datas[$j]->elements[$i]->nombre)) ? $datas[$j]->elements[$i]->nombre : 0;
                    }
                    ${'data_y' . $i} = $data_y;
                    unset($data_y);
                }
            }
            // Create the graph. These two calls are always required
            $graph = new Graph(720,550,'auto');
            $graph->SetScale("textlin");

            $theme_class=new UniversalTheme;
            $graph->SetTheme($theme_class);
            
            // graduation sur l'axe des ordonnées
            $graph->SetBox(false);

            $graph->ygrid->SetFill(false);

            // graduation sur l'axe des X
            
            if (!$byDate) {
                $threelastMonths = self::getThreeLastMonth();
                $graph->xaxis->SetTickLabels(array($threelastMonths[0], $threelastMonths[1], $threelastMonths[2]));
            } else {
                $graduationX = self::getGraduationX($datas);
                $graph->xaxis->SetTickLabels($graduationX);
            }
            $graph->yaxis->HideLine(false);
            $graph->yaxis->HideTicks(false,false);
            
            $groupedGbPlot = "";
            $color = array("#B2C942", "#E81C19", "#5F69BF", "#E2D114", "#76C1B1", "#BA9155", "#BA7C94", "#3BCE79", "#5F9174");
            //$color = array('#ba3d9c','#d3af45','#3e3cb7','#d36f45','#3cb7aa','#cc434f','#3c7ab7','#d3cc45');
            // Create the bar plots

            $plotArray = array();
            for ($j=0; $j<$nbFormule; $j++) {
                ${'bplot_' . $j} = new BarPlot(${'data_y' . $j});
                $plotArray[] = ${'bplot_' . $j};
            }

            // Create the grouped bar plot
            $gbplot = new GroupBarPlot($plotArray);
            // ...and add it to the graPH
            $graph->Add($gbplot);


            $graph->title->Set("Formules / mois ");
            
            // couleur des graphiques
             for ($j=0; $j<$nbFormule; $j++) {
                 ${'bplot_'.$j}->SetColor("white");
                 ${'bplot_'.$j}->SetFillColor($color[$j]);
             }

            // Display the graph
            $imageName = 'image_'.date('Ymdhis').'.png';
            $image = JELIX_APP_WWW_PATH . STATISTIQUE_PATH_GRAPH . $imageName;
            @unlink($image); 
            $graph->Stroke($image);
            $ret->image     = $imageName;
            $ret->formule   = (isset($_SESSION['sess_formule']))? unserialize($_SESSION['sess_formule']) : $toTake;
            unset($_SESSION['sess_formule']);
        } else {
            // aucune donnée
            $ret->image     = "";
            $ret->formule   = "";
        }
        
        

        return $ret;
    }

    
    /**
     * récupère les formules et les nmbres
     * @return array
     */
    public static function getFormule($formule) {
        $ret = array();
        foreach ($formule['tarif'] as $item){
            $tarif = new stdClass();
            $tarif->formule = $item->Occas_Montantpaye;
            $tarif->nombre  = $item->nombre;
            $ret [] = $tarif;
        }

        return $ret;
    }


    /**
     * groupe les données par date
     * @return array
     */
    public static function groupByDate($datas) {
        $ret = $result = $sess_formule = array();
        $countDate = $countFormule = 0;
        foreach ($datas as $k=>$item){
            $countFormule ++;
            $tarif = new stdClass();
            $tarif->formule = $item->Occas_Montantpaye;
            $tarif->nombre  = $item->nombre;
            $ret [] = $tarif;
            $sess_formule[] = $item->Occas_Montantpaye;
            if ( (isset($datas[$k+1]->currentDate) && $datas[$k+1]->currentDate != $item->currentDate) || !isset($datas[$k+1]->currentDate) ) {
                $objet = new stdClass();
                $objet->elements    = self::triTarif($ret);
                $objet->currentDate = $item->currentDate;
                $objet->nbFormule   = $countFormule;
                $result[] = $objet;
                $countDate ++;
                unset($ret);
                $countFormule = 0;
            }
        }
        // récupération des formules pour la plage de date
        $sess_formule = array_unique($sess_formule);
        asort($sess_formule);
        $_SESSION['sess_formule'] = serialize($sess_formule);
        $result['nbDate'] = $countDate;

        // il arrive que un elements, on n'a pas forcément la formule 13€ par exemple, on va complete le tableau en donnant ce dernier et l'initialiser à 0
        $resultTmp = self::completeFormule($result);
        return $resultTmp;
    }

    /**
     * Trie par order croissant les tarof des formules
     *
     */
    public static function triTarif($tarif) {
        $ret = $tmp = $tmp2 = array();
        if (sizeof($tarif)) {
            foreach ($tarif as $k=>$item) {
                $tmp[]  = $item->formule;
                $tmp2[] = $item->nombre;
            }

            asort($tmp);

            foreach ($tmp as $key=>$val) {
                $data = new stdClass();
                $data->formule = $val;
                $data->nombre = $tmp2[$key];

                $ret [] = $data;
            }
        }
        return $ret;
    }
    /**
     * Nbr max des formules
     *
     */
    public static function getNbMaxFormule($datas) {
        $ret = array();
        if (sizeof($datas)) {
            foreach ($datas as $item) {
                $ret[]  = (isset($item->nbFormule))? $item->nbFormule : 0;
            }
        }
        return max($ret);
    }
    /**
     * Nbr max des formules
     *
     */
    public static function getGraduationX($datas) {
        $ret = array();
        if (sizeof($datas)) {
            foreach ($datas as $item) {
                $ret[]  = (isset($item->currentDate)) ? $item->currentDate : "";
            }
        }
        return $ret;
    }

    /**
     * Faciliter l'affichage des codes couleur des légende des formules, en completant le tableau elements
     *
     */
    public static function completeFormule($datas) {
        $tmp = $tmp2 = array();
        $formuleDisponible = (isset($_SESSION['sess_formule']))? unserialize($_SESSION['sess_formule']) : array();
        if (sizeof($datas)) {
            foreach ($datas as $item) {
                if (isset($item->elements) && sizeof($item->elements)) {
                    foreach ($item->elements as $elements) {
                        if (isset($elements->formule)) 
                            $tmp2 [] = $elements->formule;
                        $tmp[] = $elements;
                    }
                    
                    $diff = array_diff($formuleDisponible, $tmp2);
                    if (sizeof($diff)) {
                        foreach ($diff as $dispo) {
                            $tarif = new stdClass();
                            $tarif->formule = $dispo;
                            $tarif->nombre  = 0;

                            $tmp[] = $tarif;
                        }
                    }
                    $item->elements = self::triTarif($tmp);
                    unset($tmp);
                    unset($tmp2);
                    unset($diff);
                }
            }
        }
       // print_r($datas);die();
        return $datas;
    }


    /**
     * récupère les trois derniers mois
     * @return array
     */
    public static function getThreeLastMonth () {
        $tMois = array  (
                            "-1"=>"Novembre",
                            "0"=>"Décembre",
                            "1"=>"Janvier",
                            "2"=>"Février",
                            "3"=>"Mars",
                            "4"=>"Avril",
                            "5"=>"Mai",
                            "6"=>"Juin",
                            "7"=>"Juillet",
                            "8"=>"Août",
                            "9"=>"Septembre",
                            "10"=>"Octobre",
                            "11"=>"Novembre",
                            "12"=>"Décembre"
                        );

          $moisEnCours = (int)date('m');
          return array($tMois[$moisEnCours],$tMois[$moisEnCours - 1], $tMois[$moisEnCours - 2] );
    }

}